#! /usr/bin/env Python3
#coding=utf-8

"""
自己编写的Python3数据检查相关的函数
作者: KydGroups
版本: 1.0.0
完成日期: 2024-10-23
修改记录:
"""

def IsRepetitiveListUnit(dictData:dict={}, listOri:list=[], listFields:list=[], nFloatNum:int=4):
    """
    :DESCRIPTION:
        判断字典数据是否为列表的重复数据
    :PARAMS:
        dictData: 要判断的字典数据
        listOri: 保存数据的列表
        listFields: 可以不设置
                    如果设置了则只判断dictData中的对应键值
                    如果没有设置则判断dictData.keys()与listOri的第一个元素的keys()
        nFloatNum: 如果键值中有float型数据,则保存多少的精度以文本文件比对
    :RETURNS:
        1: 是重复数据
        0: 不是重复数据,列表中没有该数据,如果listOri为空也返回该值
        -1: 字典数据中有不存在的key,dictData没有数据, listOri第一个元素不是dict类型
    """
    if not dictData: #如果没有传入要检查的数据
        return -1
    if len(listOri) <= 0: #如果列表中没有数据
        return 0
    if not isinstance(listOri[0], dict): #如果列表中的第一个元素不是字典类型
        return -1
    if nFloatNum <= 0: #判断浮点精度
        nFloatNum = 4
    if not listFields: #如果没有传入判断键值
        listFields = listOri[0].keys() #使用列表的第一个元素的keys()
    for item in listOri: #循环判断列表中的每一个元素
        bSame = True
        for key in listFields: #检查每一组数据的每一个键值
            if key not in dictData.keys(): #如果该键不在dictData.keys()中则出错
                return -1
            if isinstance(item[key], float): #如果是float型数据,则转换为对应精度的字符串比较
                strFormat = "%%.%df" % nFloatNum #浮点型数据格式
                strItemValue = strFormat % item[key] 
                strDataValue = strFormat % dictData[key]
                if strItemValue != strDataValue: #如果浮点数不相等,则表示该单元数据不同
                    bSame = False
                    break
            else:
                if item[key] != dictData[key]: #如果键值不相同,则表示该单元数据不同
                    bSame = False #设置不同标志
                    break #中断本级循环
        if bSame: #如果出现相同的数据
            print("出现重量数据!")
            print(dictData)
            return 1
    else: #循环结束还没有相同的数据,则表示没有相同的数据
        return 0
